<?php

namespace app\admin\middleware;

use app\admin\model\Administrator;
use think\facade\Request;

class CheckLogin
{
	/**
	 * 处理请求的中间件，验证管理员是否已经登录
	 * 该方法主要用于校验请求中的token以及判断token是否过期
	 *
	 * @param mixed $request 请求对象，用于获取请求头中的token以及携带用户信息到下一个中间件或终端处理程序
	 * @param \Closure $next 闭包函数，代表下一个中间件或终端处理程序
	 *
	 * @return mixed 返回下一个中间件或终端处理程序的执行结果，或返回错误信息及状态码
	 */
	public function handle($request, \Closure $next)
	{
	    // 从请求头中获取token
	    $token = $request->header('t', $request->param('t', ''));

	    // 如果token为空，返回401状态码及错误信息
	    if (empty($token)) {
	        return responseData(401, 'json');
	    }

	    // 通过token获取用户信息
	    $user = Administrator::getUserByToken($token);

	    // 如果用户不存在或token无效，返回401状态码及错误信息
	    if (!$user) {
	        return responseData(401,'json');
	    }
	    // 如果用户的token已经过期，返回402状态码
	    if ($user->token_expire < time()) {
		    return responseData(402, 'json');
	    }
		// todo 多应用模式下 中间件的 Request实例与控制器实例为单独的实例，所以这里将用户信息保存到全局Request实例中
		Request::instance()->userinfo = $user;
		$user->token_expire = time() + config('app.token_expire');
		$user->save();

	    // 执行下一个中间件或终端处理程序
	    return $next($request);
	}
}